package com.xdxc.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;

public class DateTimeUtils {

    // 常用格式
    public static final String DATE_FORMAT = "yyyy-MM-dd";
    public static final String TIME_FORMAT = "HH:mm:ss";
    public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DATE_TIME_WITH_MS_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";

    // 格式化 LocalDateTime 为 String
    public static String formatDateTime(LocalDateTime localDateTime, String format) {
        if (localDateTime == null) {
            return null;
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return localDateTime.format(formatter);
    }

    // 格式化 LocalDate 为 String
    public static String formatDate(LocalDate localDate, String format) {
        if (localDate == null) {
            return null;
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return localDate.format(formatter);
    }

    // 格式化 LocalTime 为 String
    public static String formatTime(LocalTime localTime, String format) {
        if (localTime == null) {
            return null;
        }
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return localTime.format(formatter);
    }

    // 解析日期字符串为 LocalDate
    public static LocalDate parseDate(String dateStr, String format) throws ParseException {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return LocalDate.parse(dateStr, formatter);
    }

    // 解析日期时间字符串为 LocalDateTime
    public static LocalDateTime parseDateTime(String dateTimeStr, String format) throws ParseException {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return LocalDateTime.parse(dateTimeStr, formatter);
    }

    // 解析时间字符串为 LocalTime
    public static LocalTime parseTime(String timeStr, String format) throws ParseException {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return LocalTime.parse(timeStr, formatter);
    }

    // 将 Date 转换为 LocalDateTime
    public static LocalDateTime convertToLocalDateTime(Date date) {
        if (date == null) {
            return null;
        }
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    }

    // 将 LocalDateTime 转换为 Date
    public static Date convertToDate(LocalDateTime localDateTime) {
        if (localDateTime == null) {
            return null;
        }
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    // 将字符串日期转换为 Date（使用 SimpleDateFormat）
    public static Date parseDateStr(String dateStr, String format) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        return simpleDateFormat.parse(dateStr);
    }

    // 格式化 Date 为字符串
    public static String formatDateToString(Date date, String format) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        return simpleDateFormat.format(date);
    }

    // 获取当前时间的字符串（默认格式为 yyyy-MM-dd HH:mm:ss）
    public static String getCurrentDateTimeString() {
        return formatDateTime(LocalDateTime.now(), DATE_TIME_FORMAT);
    }

    // 获取当前日期的字符串（默认格式为 yyyy-MM-dd）
    public static String getCurrentDateString() {
        return formatDate(LocalDate.now(), DATE_FORMAT);
    }

    // 获取当前时间的字符串（默认格式为 HH:mm:ss）
    public static String getCurrentTimeString() {
        return formatTime(LocalTime.now(), TIME_FORMAT);
    }

    // 获取当前时间戳（毫秒）
    public static long getCurrentTimestamp() {
        return System.currentTimeMillis();
    }

    // 获取当前时间戳（秒）
    public static long getCurrentTimestampInSeconds() {
        return System.currentTimeMillis() / 1000;
    }

    // 将时间戳转换为 Date
    public static Date timestampToDate(long timestamp) {
        return new Date(timestamp);
    }

    // 将时间戳转换为 LocalDateTime
    public static LocalDateTime timestampToLocalDateTime(long timestamp) {
        return LocalDateTime.ofInstant(new Date(timestamp).toInstant(), ZoneId.systemDefault());
    }

    // 将日期字符串转换为指定格式的日期字符串
    public static String convertDateFormat(String dateStr, String fromFormat, String toFormat) throws ParseException {
        Date date = parseDateStr(dateStr, fromFormat);
        return formatDateToString(date, toFormat);
    }

    // 获取当前时区的时间
    public static Date getCurrentTimeInTimezone(String timezone) {
        TimeZone.setDefault(TimeZone.getTimeZone(timezone));
        return new Date();
    }

    // 将时间转换为“1秒前”，“1分钟前”，“2小时前”等格式
    public static String formatTimeAgo(LocalDateTime pastTime) {
        LocalDateTime now = LocalDateTime.now();
        Duration duration = Duration.between(pastTime, now);

        long seconds = duration.getSeconds();

        if (seconds < 60) {
            return seconds + "秒前";
        } else if (seconds < 3600) {
            long minutes = TimeUnit.SECONDS.toMinutes(seconds);
            return minutes + "分钟前";
        } else if (seconds < 86400) {
            long hours = TimeUnit.SECONDS.toHours(seconds);
            return hours + "小时前";
        } else if (seconds < 2592000) { // 30天 * 24小时 * 3600秒
            long days = TimeUnit.SECONDS.toDays(seconds);
            return days + "天前";
        } else if (seconds < 31536000) { // 12个月 * 30天 * 24小时 * 3600秒
            long months = seconds / (30L * 24 * 3600);
            return months + "个月前";
        } else {
            long years = seconds / (365L * 24 * 3600);
            return years + "年前";
        }
    }
}



